import { createI18n } from "vue-i18n";
import { getLanguage, setLanguage } from "@/utils/storage/token";

// 自动根据浏览器系统语言设置语言
const navLang = navigator.language;
let currentLang = getLanguage() || navLang || "zh-CN";

setLanguage(currentLang);

const i18n: any = createI18n({
  legacy: false,
  globalInjection: true,
  locale: currentLang,
});

const importLocaleMessages = async (locale: string) => {
  const messagesModule = await import(`@/locale/${locale}/index.ts`);
  return messagesModule.default;
};

/**
 * 是否已载入语言文件
 * @param lang - 语言
 *
 **/
const hasLocaleMessages = (lang: string) => {
  const messages = i18n.global.messages[lang];
  return messages?.hasOwnProperty("name");
};

/**
 * 动态加载语言文件(使用时才真正加载语言文件)
 * @param lang - 语言
 *
 **/
const switchLanguage = async (lang: string) => {
  if (!hasLocaleMessages(lang)) {
    //语言文件未加载，先加载相应语言文件
    const language = await importLocaleMessages(lang);
    i18n.global.setLocaleMessage(lang, language);
  }
  i18n.global.locale = lang;
  setLanguage(lang);
};

/**
 * 初始化时导入默认语言
 *
 **/
i18n.loadDefault = () => {
  switchLanguage(currentLang);
  return i18n;
};

export default i18n;
export { switchLanguage };
